import logging.handlers
import logging
import os
from configs.config import DIR_PATH
from colorama import Fore, Style, init

# 初始化 colorama（兼容 Windows 控制台）
init(autoreset=True)


class ColoredFormatter(logging.Formatter):
    """
    自定义日志格式化器，为整个日志记录添加颜色。
    """
    LOG_COLORS = {
        logging.DEBUG: Fore.CYAN,
        logging.INFO: Fore.GREEN,
        logging.WARNING: Fore.YELLOW,
        logging.ERROR: Fore.RED,
        logging.CRITICAL: Fore.MAGENTA,
    }

    def __init__(self, fmt, datefmt=None):
        super().__init__(fmt, datefmt)

    def format(self, record):
        # 获取日志颜色
        log_color = self.LOG_COLORS.get(record.levelno, "")
        # 格式化整条日志，添加颜色
        formatted_message = super().format(record)
        return f"{log_color}{formatted_message}{Style.RESET_ALL}"


class Logger:
    __log = None

    @classmethod
    def logger(cls, level=logging.INFO):
        if cls.__log is None:
            # 获取日志器
            cls.__log = logging.getLogger()
            # 设置日志器级别
            cls.__log.setLevel(level)

            # 定义日志文件路径
            filename = DIR_PATH + os.sep + "log" + os.sep + "tpshop_auto.log"

            # 确保日志目录存在
            log_dir = os.path.dirname(filename)
            os.makedirs(log_dir, exist_ok=True)

            # 文件日志处理器
            tf = logging.handlers.TimedRotatingFileHandler(
                filename=filename, when="midnight", interval=1, backupCount=3, encoding="utf-8"
            )

            # 控制台日志处理器
            console_handler = logging.StreamHandler()

            # 定义日志格式
            fmt = "%(asctime)s - %(levelname)s - [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s"
            file_formatter = logging.Formatter(fmt)
            console_formatter = ColoredFormatter(fmt)

            # 设置格式器
            tf.setFormatter(file_formatter)
            console_handler.setFormatter(console_formatter)

            # 添加处理器到日志器
            cls.__log.addHandler(tf)
            cls.__log.addHandler(console_handler)

        return cls.__log


if __name__ == '__main__':
    # 测试日志输出
    logger = Logger.logger(logging.DEBUG)
    logger.debug("这是一个调试日志")
    logger.info("这是一个信息日志")
    logger.warning("这是一个警告日志")
    logger.error("这是一个错误日志")
    logger.critical("这是一个严重错误日志")
